#include <avr/interrupt.h>
#include <LiquidCrystal.h>

int buffer[34];
int cmpt;
int iLoop;
char msg[0x100];

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#ifndef F_CPU
  #define F_CPU 16000000
#endif
#define _UBRR2 (F_CPU/8/9600-1)
volatile bool mem;

void setup(void) {
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Debut");
  Serial.begin(115200);
//  digitalWrite(18, HIGH);
//  digitalWrite(19, LOW);
//  pinMode(18, INPUT);
//  pinMode(19, INPUT);Â
  UBRR2H=(_UBRR2>>8);
  UBRR2L=_UBRR2;
  UCSR2A=(1<<U2X2);
  UCSR2B=(0<<TXEN2)|(1<<RXEN2)|(1<<RXCIE2)|(1<<UCSZ32);
  UCSR2C=(0<<UMSEL20)|(3<<UPM20)|(0<<USBS2)|(3<<UCSZ20);
  mem=false;
}

volatile uint8_t dmyError;
volatile uint8_t dmyBit9;
volatile uint8_t dmyData;

//ISR(USART1_RX_vect) {
//  dmyError = UCSR1A;
//  dmyBit9 = UCSR1B;
//  dmyData = UDR1;
//  if (!(dmyError & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))) {
//    if ((dmyBit9 & (1<<RXB81)) == 0) {
//      if ((dmyData & 0x0F) == 0) {
//        lcd.setCursor(0,0);
//        lcd.print((dmyData>>4) xor 0x0F,HEX);
//      }
//    }
//  }


////  if (!(dmyError & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))) {

//    if (!mem) {
//      if (dmyData == 0xFE) {
//        mem = true;
//        cmpt=0;
//      }
//    } else if (dmyData == 0xFF) {
//      mem = false;
//    } else {
//      if (cmpt<32) {
//        buffer[cmpt]=dmyData;
//        cmpt++;
//      }
//    }
////  }
//}

int value;
volatile int line=0;
int nbValue =0;
int attente = 0; 

int startValue = 0;
int moreValue = 0;
int moreData = 0;
int nbData = 0;
bool alarm=false;

void loop(void) {
  if (Serial2.available() ) {
    value = Serial2.read();

    if (startValue==0) {
      if (value==0x00) {
//        Serial.println(value,HEX);
      } else if (value==0xFE) {
        startValue = 0xFE;
        moreValue=32;
      } else if (value==0x7E) {
        startValue = 0x7E;
        moreValue = 0;
        nbData = 0;
        Serial.print(value,HEX);
        Serial.print(" ");
      } else if (value==0xF0) {
        Serial.print("Boutons: ");
        Serial.println(value,HEX);
      } else {
        Serial.print("Unknown start: ");
        Serial.println(value,HEX);
      }
      
    } else if (startValue==0xFE) {
      if ((moreValue==0)&&(value==0xFF)) {
        msg[32]=0;
        lcd.setCursor(0,0);
        lcd.print(msg);
        lcd.setCursor(0,1);
        lcd.print(&(msg[16]));
        Serial.println(msg);
        startValue=0;
      } else {
        msg[32-moreValue]=value;
        moreValue--;
      }
    } else if (startValue==0x7E) {
      nbData++;
      if (nbData == 1) {
        Serial.print(value,HEX);
        if (value==0x9F) {
          Serial.print(" ");
        } else if (value==0x1F) {
          Serial.print(" ");
        } else if (value==0x2F) {
          Serial.print(" ");
        } else if (value==0x3F) {
          Serial.print(" ");
        } else if (value==0x4F) {
          Serial.print(" ");
        } else if (value==0x92) {
          Serial.print(" ");
          alarm=true;
        } else {
          Serial.println(" #Unknown cmd");
          startValue = 0;
        }
      } else if (nbData == 2) {
        if (alarm) {
          Serial.print(value,HEX);
          msg[1]=0;
        } else {
          moreValue=value&0x1F;
          Serial.print(value,HEX);
          msg[moreValue]=0;
        }
        Serial.print(" ");
      } else if (alarm) {
        msg[0]=value;
        Serial.print("Alarme: ");
        Serial.println(msg);
        startValue = 0;
        alarm=false;
      } else {
        Serial.print(value,HEX);
        msg[nbData-3]=value;
        moreValue--;
        if (moreValue==0) {
          Serial.println("");
//          Serial.println(msg);
          startValue = 0;
        } else {
          Serial.print(" ");
        }    
      } 
    }
  }

//    buffer[cmpt]=value;
//    cmpt++;
//    if ((cmpt==16)||(value == 0xFF)) {
//
//      for (iLoop=0;iLoop<cmpt;iLoop++) {
//        Serial.print(buffer[iLoop],HEX);
//        Serial.print(" ");
//      }
//      for (iLoop=0;iLoop<cmpt;iLoop++) {
//        msg[iLoop]=buffer[iLoop];
//      }
//      msg[cmpt]=0;
//      Serial.println(msg);
////      lcd.setCursor(0,0);
////      lcd.print(msg);
////      lcd.setCursor(0,1);
////      lcd.print(&(msg[16]));
//      
//      cmpt=0;
//    }
//  }
////  attente++;
////  if (cmpt==0) {
////    attente=0;
////  }
////  if (cmpt==1) {
////    Serial.print("Attente: ");
////    Serial.println(attente,DEC);
////  }
////  delay(1);
}
